/**
 * Copyright: Copyright (c) 2018, 2022
 * Company: 杭州叙简科技股份有限公司
 */
package cn.com.scooper.controller.data;

import java.util.List;
import java.util.Locale;
import java.util.concurrent.Callable;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.context.request.async.WebAsyncTask;

import cn.com.scooper.common.resp.APIListJson;
import cn.com.scooper.common.resp.APIPage;
import cn.com.scooper.common.resp.APIPageJson;
import cn.com.scooper.common.resp.APIRespJson;
import cn.com.scooper.common.resp.ResultCode;

/**
 * 数据Controller基类，该类封装了常用的返回操作
 *
 * @date 2019-07-23
 * @author LuLihong
 */
public class BaseDataController {

    @Autowired
    protected MessageSource messageSource;
    
    /**
     * 返回操作成功
     * @return
     */
    protected APIRespJson response() {
        return new APIRespJson();
    }
    
    /**
     * 返回指定错误码
     * @param code
     * @return
     */
    protected APIRespJson response(int code) {
        return new APIRespJson(code, messageSource.getMessage("resultcode." + code, null, Locale.CHINESE));
    }
    
    /**
     * 返回指定错误码，并携带错误信息
     * @param code
     * @param message
     * @return
     */
    protected APIRespJson response(int code, String message) {
        return new APIRespJson(code, message);
    }

    /**
     * 返回数据
     * @param data
     * @return
     */
    protected APIRespJson responseData(Object data) {
        return new APIRespJson().setData(data);
    }
    
    /**
     * 以列表形式返回数据
     * @param data
     * @return
     */
    protected <T> APIRespJson responseList(List<T> data) {
        return new APIListJson<T>(data);
    }

    /**
     * 以分页形式返回数据
     * @param data
     * @return
     */
    protected <T> APIRespJson responsePage(APIPage<T> data) {
        return new APIPageJson<T>(data);
    }


    /**
     * 包装异步处理任务，默认超时时间为 30s；
     * 处理超时时返回JSON错误码。
     * 
     * @param callable
     * @return
     */
    protected WebAsyncTask<APIRespJson> webAsync(Callable<APIRespJson> callable) {
        return webAsync(30000L, callable);
    }
    
    /**
     * 包装异步处理任务；
     * 处理超时时返回JSON错误码。
     * 
     * @param timeout 超时时间
     * @param callable
     * @return
     */
    protected WebAsyncTask<APIRespJson> webAsync(long timeout, Callable<APIRespJson> callable) {
        WebAsyncTask<APIRespJson> task = new WebAsyncTask<APIRespJson>(timeout, callable);
        task.onTimeout(onWebAsyncTimeout);
        return task;
    }

    /**
     * 异步处理超时处理方法
     */
    private final Callable<APIRespJson> onWebAsyncTimeout = new Callable<APIRespJson>() {
        @Override
        public APIRespJson call() throws Exception {
            return response(ResultCode.EXEC_TIMEOUT);
        }
    };

}
